#ifndef _MCU_DRIVERS_INNERFLASH_H_
#define _MCU_DRIVERS_INNERFLASH_H_

//一个指令占2个16位，其中高16位的高8位为虚字节
typedef union OneInstruction {
    uint32_t UINT32;
    struct {
        uint16_t LowWord;  //低16位
        uint16_t HighWord; //高16位
    } HighLowUINT16s;
} OneInstruction_t;

//一个地址占2个16位，其中高16位为Flash大页面
typedef union FlashAddr {
    uint32_t Uint32Addr;
    struct {
        uint16_t LowAddr;  //低16位
        uint16_t HighAddr; //高16位
    } Uint16Addr;
} FlashAddr_t;

//读取一个指令字
OneInstruction_t InnerFlash_ReadOneInstruction(FlashAddr_t flashAddr);

//读取低16位
unsigned int InnerFlash_ReadInstructionLow(FlashAddr_t flashAddr);

//读取高16位，仅低8位有效，高8位始终为0
unsigned int InnerFlash_ReadInstructionHigh(FlashAddr_t flashAddr);

//擦除0x000800倍数起始的1024个字(2048个地址，一页)
unsigned int InnerFlash_EraseFlashPage(FlashAddr_t flashAddr);

//需要先擦除，再写入
//写入Flash，2个指令字为一组,若为奇数，最后一个填充为0xFFFFFF
//每个指令字的低16位存储一个数据，即2个地址存储1个16位数据
//例如 data[2]={0xaa05,0xaa06};，存入0x004000，即0x004000存入0x00aa05,0x004002存入0x00aa06
void InnerFlash_WriteInstructionsToFlash(volatile FlashAddr_t source_addr,volatile OneInstruction_t *data,volatile uint16_t dataLength);

#endif